﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>发送消息 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 发送消息 function sends a message to a window or control and waits 遍历 acknowledgement." />
<meta name="ahk:equiv-v1" content="commands/PostMessage.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>发送消息</h1>

<p>发送消息到窗口或控件并等待回复.</p>

<pre class="Syntax">Result := <span class="func">发送消息</span>(Msg <span class="optional">, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout</span>)</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>Msg</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    <p>要发送的消息的编号. 请参阅<a href="../misc/SendMessageList.htm">消息列表</a>来确定编号.</p>
  </dd>

  <dt>wParam, lParam</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a>或<a href="../Concepts.htm#objects">对象</a></p>
    <p>消息的参数. 如果省略, 每个参数默认为 0.</p>
    <p>每个参数必须是一个<a href="../Concepts.htm#numbers">整数</a>或一个具有 <a href="../objects/Buffer.htm#Ptr">Ptr</a> 属性的对象, 比如 <a href="../objects/Buffer.htm">Buffer</a>. 对于需要指向字符串指针的消息, 使用 Buffer 或 <a href="StrPtr.htm">字符串指针</a> 函数. 如果通过将变量的地址传递给 发送消息 来改变变量所包含的字符串, 那么之后必须通过调用 <a href="VarSetStrCapacity.htm#neg1">VarSetStrCapacity(MyVar, -1)</a> 来更新变量的长度.</p>
    <p>如果 AutoHotkey 或目标窗口是 32 位的, 则只使用参数的低 32 位; 也就是说, 如果超出了有符号值的范围 -2147483648 到 2147483647(-0x80000000 to 0x7FFFFFFF), 或者超出了无符号值的范围 0 到 4294967295(0xFFFFFFFF), 则值会被截断. 如果 AutoHotkey 和目标窗口都是 64 位的, 可以使用 <a href="../Concepts.htm#pure-numbers">AutoHotkey 所支持的</a>任何整数值.</p>
  </dd>

  <dt>Control</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a>, <a href="../Concepts.htm#numbers">整数</a>或<a href="../Objects.htm">对象</a></p>
    <p>如果省略此参数, 则消息会被直接发送到目标窗口而不是它的某个控件. 否则, 这个参数可以是控件的 ClassNN, 文本或 HWND, 或者是一个具有<code>Hwnd</code> 属性的对象. 有关详情, 请参阅<a href="Control.htm#Parameter">控件参数</a>.</p>
    <p>如果这个参数指定了一个 HWND(作为一个整数或对象), 那么它不需要是一个控件(子窗口) 的 HWND. 也就是说, 它也可以是一个顶层窗口的 HWND.</p>
  </dd>

  <dt>WinTitle</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a>, <a href="../Concepts.htm#numbers">整数</a>或<a href="../Objects.htm">对象</a></p>
    <p>识别目标窗口的窗口标题或其他条件. 请参阅 <a href="../misc/WinTitle.htm">WinTitle</a>.</p>
  </dd>

  <dt>WinText</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>如果存在, 此参数必须是目标窗口的单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 如果 <a href="DetectHiddenText.htm">检测隐藏文本</a> 为 ON, 那么会检测隐藏文本元素.</p>
  </dd>

  <dt>ExcludeTitle</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>标题中含有此参数值的窗口将被排除.</p>
  </dd>

  <dt>ExcludeText</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>文本中含有此参数值的窗口将被排除.</p>
  </dd>

  <dt>Timeout</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    <p>等待目标窗口处理消息的最大毫秒数. 如果省略, 默认为 5000(ms). 如果消息在这段时间内没有被处理, 则会抛出一个异常.</p>
  </dd>

</dl>

<h2 id="Return_Value">返回值</h2>
<p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
<p>该函数返回消息的结果, 有时可能是一个 &quot;回复&quot;, 这取决于消息的性质及其目标窗口.</p>
<p>可能的值范围取决于目标窗口和正在运行的 AutoHotkey 版本. 当使用 32 位版本的 AutoHotkey, 或者如果目标窗口是 32 位的, 结果是一个 32 位的无符号整数, 介于 0 和 4294967295 之间. 当使用 64 位版本的 AutoHotkey 和 64 位窗口时, 结果是介于 -9223372036854775808 和 9223372036854775807 之间的 64 位有符号整数.</p>
<p>如果期望结果是一个 32 位有符号的整数(从 -2147483648 到 2147483648 的值), 它可以被截断为 32 位, 并转换成一个有符号的值, 如下所示:</p>
<pre>MsgReply := MsgReply &lt;&lt; 32 &gt;&gt; 32</pre>
<p>即使在 64 位的 AutoHotkey 上, 这种转换也是必要的, 因为来自 32 位窗口的结果是零扩展的. 例如, 来自 32 位窗口的 -1 结果在任何版本的 AutoHotkey 上都被视为 0xFFFFFFFF, 而来自 64 位窗口的 -1 在 32 位 AutoHotkey 被视为 0xFFFFFFFF, 在 64 位 AutoHotkey 被视为 -1.</p>

<h2 id="Error_Handling">错误处理</h2>
<p>在以下情况下会抛出异常:</p>
<ul>
  <li>找不到目标窗口或控件.</li>
  <li>消息超时.</li>
  <li>消息不能被发送. 例如, 如果目标窗口运行在比脚本更高的完整性级别上(例如, 它以管理员身份运行, 而脚本不是), 消息可能被阻止.</li>
</ul>

<h2 id="Remarks">备注</h2>
<p>应该小心使用该函数, 因为发送消息到错误的窗口(或发送错误的消息) 可能导致意外的行为或者甚至让目标应用程序崩溃. 这是因为大多数应用程序并不是设计用于从外部来源中接受某些类型的消息.</p>
<p>发送消息 等待目标窗口处理消息, 直到超时期结束. 与此相反, <a href="PostMessage.htm">投递消息</a> 将消息放入与目标窗口相关联的消息队列中, 而无需等待确认或回复.</p>
<p>字符串参数必须按<a href="StrPtr.htm">地址</a>传递. 例如:</p>
<pre>运行 "Notepad"
等待窗口 "无标题 - 记事本"
发送消息 0xC, 0, 字符串指针("New Notepad Title")  <em>; 0XC is WM_SETTEXT</em></pre>
<p>要发送消息到系统中的所有窗口, 包括隐藏或禁用的那些, 请在 <em>WinTitle</em> 中指定 <code>0xFFFF</code>(0xFFFF 是 HWND_BROADCAST). 这种技术应该只用于目标为广播的消息, 例如:</p>
<pre>发送消息 0x1A,,,, 0xFFFF  <em>; 0x1A is WM_SETTINGCHANGE</em></pre>
<p>要让脚本接收消息, 请使用 <a href="OnMessage.htm">在收到消息时</a>.</p>
<p>请参阅<a href="../misc/SendMessage.htm">消息指南</a>来查看使用这些命令的介绍.</p>
<p>窗口标题和文本是区分大小写的. 除非 <a href="DetectHiddenWindows.htm">检测隐藏窗口</a> 被打开, 否则不会检测隐藏窗口.</p>

<h2 id="Related">相关</h2>
<p><a href="PostMessage.htm">投递消息</a>, <a href="../misc/SendMessageList.htm">Message List</a>, <a href="../misc/SendMessage.htm">Message Tutorial</a>, <a href="OnMessage.htm">在收到消息时</a>, <a href="../misc/Winamp.htm">Automating Winamp</a>, <a href="DllCall.htm">动态库调用</a>, <a href="ControlSend.htm">发送操作到控件</a>, <a href="MenuSelect.htm">选择菜单</a></p>

<h2 id="Examples">示例</h2>

<div class="ex" id="ExMonitorPower">
<p><a href="#ExMonitorPower">#1</a>: 通过热键关闭显示器. 在 发送消息 行中, 将数字 2 替换为 -1 以打开显示器, 或将其替换为 1 以激活显示器的低功耗模式.</p>
<pre>#o::  <em>; Win+O 热键</em>
{
    等待 1000  <em>; 让用户有机会释放按键(以防释放它们时再次唤醒显视器).
    ; 关闭显示器:</em>
    发送消息 0x112, 0xF170, 2,, "Program Manager"  <em>; 0x112 is WM_SYSCOMMAND, 0xF170 is SC_MONITORPOWER.</em>
}</pre>
</div>

<div class="ex" id="ExScreenSave">
<p><a href="#ExScreenSave">#2</a>: 启动用户选择的屏幕保护程序:</p>
<pre>发送消息 0x112, 0xF140, 0,, "Program Manager"  <em>; 0x112 is WM_SYSCOMMAND, and 0xF140 is SC_SCREENSAVE.</em></pre>
</div>

<div class="ex" id="ExVScrollUp">
<p><a href="#ExVScrollUp">#3</a>: 向上滚动一行(用于含垂直滚动条的控件):</p>
<pre>发送消息 0x115, 0, 0, 获取焦点控件("A")</pre>
</div>

<div class="ex" id="ExVScrollDown">
<p><a href="#ExVScrollDown">#4</a>: 向下滚动一行:</p>
<pre>发送消息 0x115, 1, 0, 获取焦点控件("A")</pre>
</div>

<div class="ex" id="ExWinamp">
<p><a href="#ExWinamp">#5</a>: 这个例子请求 Winamp 的当前活动的轨道编号(有关详情, 请参阅 <a href="../misc/Winamp.htm">Automating Winamp</a>.</p>
<pre>设置标题匹配模式 2
track := 发送消息(1024, 0, 120,, "- Winamp")
track++  <em>; Winamp 的计数从 "0" 开始, 所以加 1 进行调整.</em>
信息框 "Track #" track " is active or playing."
</pre>
</div>

<div class="ex" id="ExPID">
<p><a href="#ExPID">#6</a>: 找出 AHK 脚本的进程 ID(另一种方法是 <a href="WinGetPID.htm">获取窗口进程编号</a>):</p>
<pre class="NoIndent">设置标题匹配模式 2
检测隐藏窗口 true
pid := 发送消息(0x44, 0x405, 0, , "SomeOtherScript.ahk - AutoHotkey v")
信息框 pid " is the process id."</pre>
</div>

</body>
</html>